/*# 	DS1302代码片段说明
	1. 	本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
	2. 	参赛选手可以自行编写相关代码或以该代码为基础，根据所选单片机类型、运行速度和试题
		中对单片机时钟频率的要求，进行代码调试和修改。
*/								


#include <REGX52.H>
#include <intrins.H>
sbit SDA=P2^3;
sbit SCK=P1^7;
sbit RST=P1^3;

unsigned char DS1302_Time[3]={23,59,55};//DS1302中的时分秒。

//ds1302写字节
void Write_Ds1302(unsigned  char temp) 
{
	unsigned char i;
	for (i=0;i<8;i++)     	
	{ 
		SCK = 0;
		SDA = temp&0x01;
		temp>>=1; 
		SCK=1;
	}
}   

//ds1302写入地址数据
void Write_Ds1302_Byte( unsigned char address,unsigned char dat )     
{
 	RST=0;	_nop_();
 	SCK=0;	_nop_();
 	RST=1; 	_nop_();  
 	Write_Ds1302(address);	
 	Write_Ds1302(dat);		
 	RST=0; 
}

//ds1302读数据
unsigned char Read_Ds1302_Byte ( unsigned char address )
{
 	unsigned char i,temp=0x00;
 	RST=0;	_nop_();
 	SCK=0;	_nop_();
 	RST=1;	_nop_();
 	Write_Ds1302(address);
 	for (i=0;i<8;i++) 	
 	{		
		SCK=0;
		temp>>=1;	
 		if(SDA)
 		temp|=0x80;	
 		SCK=1;
	} 
 	RST=0;	_nop_();
 	SCK=0;	_nop_();
	SCK=1;	_nop_();
	SDA=0;	_nop_();
	SDA=1;	_nop_();
	return (temp);			
}




/*江科大模板*/
//DS1302设置时间，将数组中的数据设置到DS1302当中
void DS1302_Set_Time()
{
	Write_Ds1302_Byte(0x8e,0x00);
	Write_Ds1302_Byte(0x84,DS1302_Time[0]/10*16+DS1302_Time[0]%10);
	Write_Ds1302_Byte(0x82,DS1302_Time[1]/10*16+DS1302_Time[1]%10);
	Write_Ds1302_Byte(0x80,DS1302_Time[2]/10*16+DS1302_Time[2]%10);
	Write_Ds1302_Byte(0x8e,0x80);	
}
//DS1302存储时间，将DS1302中变化的时间重新放到数组中进行刷新。缺点是存储时间要进行不断地刷新
void DS1302_Save_Time()
{
	unsigned char Temp=0;
	Temp=Read_Ds1302_Byte(0x85);
	DS1302_Time[0]=Temp/16*10+Temp%16;
	Temp=Read_Ds1302_Byte(0x83);
	DS1302_Time[1]=Temp/16*10+Temp%16;
	Temp=Read_Ds1302_Byte(0x81);
	DS1302_Time[2]=Temp/16*10+Temp%16;
}